#!/usr/bin/env node

/*
HTTPS证书生成脚本
用于VR开发的本地HTTPS环境
使用mkcert生成支持所有IP的本地可信证书
*/

const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
const os = require('os');

console.log('🔐 正在生成支持所有IP的HTTPS证书...');

// 获取本机所有网络接口IP
function getAllNetworkIPs() {
  const interfaces = os.networkInterfaces();
  const ips = ['localhost', '127.0.0.1', '::1', '0.0.0.0'];
  
  Object.keys(interfaces).forEach(interfaceName => {
    interfaces[interfaceName].forEach(networkInterface => {
      if (!networkInterface.internal && networkInterface.family === 'IPv4') {
        ips.push(networkInterface.address);
      }
    });
  });
  
  return [...new Set(ips)]; // 去重
}

try {
  // 检查mkcert是否可用
  const mkcertPath = path.join(process.cwd(), 'mkcert.exe');
  
  if (fs.existsSync(mkcertPath)) {
    console.log('✅ 找到本地mkcert.exe');
  } else {
    // 检查系统PATH中的mkcert
    try {
      execSync('mkcert -version', { stdio: 'ignore' });
      console.log('✅ 找到系统mkcert');
    } catch (error) {
      console.log('❌ 未找到mkcert，请确保mkcert.exe在项目根目录或安装到系统PATH');
      process.exit(1);
    }
  }
  
  // 获取所有网络IP
  const allIPs = getAllNetworkIPs();
  console.log('📱 检测到的网络IP:', allIPs);
  
  // 安装本地CA（如果还没有安装）
  console.log('📜 安装本地证书颁发机构...');
  try {
    const mkcertCmd = fs.existsSync(mkcertPath) ? `"${mkcertPath}"` : 'mkcert';
    execSync(`${mkcertCmd} -install`, { stdio: 'inherit' });
  } catch (error) {
    console.log('⚠️ CA安装可能失败，但继续生成证书...');
  }
  
  // 生成支持所有IP的证书
  console.log('🔑 生成支持所有IP的证书...');
  
  // 构建证书命令，包含所有检测到的IP
  const domains = allIPs.join(' ');
  const mkcertCmd = fs.existsSync(mkcertPath) ? `"${mkcertPath}"` : 'mkcert';
  const certCommand = `${mkcertCmd} ${domains}`;
  
  console.log('🚀 执行命令:', certCommand);
  
  try {
    execSync(certCommand, { stdio: 'inherit' });
    console.log('✅ 证书生成成功！');
    
    // 检查生成的证书文件
    const files = fs.readdirSync('.');
    const pemFiles = files.filter(f => f.endsWith('.pem'));
    
    if (pemFiles.length > 0) {
      console.log('📁 生成的证书文件:');
      pemFiles.forEach(file => {
        console.log(`   ${file}`);
        // 检查文件大小确保证书有效
        const stats = fs.statSync(file);
        console.log(`   📏 大小: ${(stats.size / 1024).toFixed(2)}KB`);
      });
    }
    
    console.log('');
    console.log('🎉 HTTPS证书配置完成！');
    console.log('');
    console.log('📋 使用方法:');
    console.log('   npm run dev:https    # 启动HTTPS开发服务器');
    console.log('   npm run start:https  # 生成证书并启动服务器');
    console.log('');
    console.log('🌐 支持的访问地址:');
    allIPs.forEach(ip => {
      if (ip !== '::1') { // IPv6地址显示会有问题
        console.log(`   https://${ip}:3034`);
      }
    });
    console.log('');
    console.log('📱 VR设备访问步骤:');
    console.log('   1. 确保VR设备与电脑在同一网络');
    console.log('   2. 在VR设备浏览器中访问上述任一HTTPS地址');
    console.log('   3. 如遇证书警告，选择"继续访问"或"高级选项"');
    console.log('   4. 点击"进入VR钓鱼"开始游戏');
    console.log('');
    console.log('⚠️ 重要提示:');
    console.log('   • VR功能必须在HTTPS环境下工作');
    console.log('   • 首次访问可能需要接受证书');
    console.log('   • 建议使用局域网IP地址访问');
    
  } catch (certError) {
    console.error('❌ 证书生成失败:', certError.message);
    
    // 提供备用方案
    console.log('');
    console.log('🔧 备用方案:');
    console.log('   1. 检查mkcert.exe是否可执行');
    console.log('   2. 尝试手动运行:');
    console.log(`      ${mkcertCmd} localhost 127.0.0.1`);
    console.log('   3. 或在VR浏览器中忽略证书警告');
    
    process.exit(1);
  }
  
} catch (error) {
  console.error('❌ 脚本执行失败:', error.message);
  
  console.log('');
  console.log('🆘 故障排除:');
  console.log('   1. 确保mkcert.exe在项目根目录');
  console.log('   2. 检查文件执行权限');
  console.log('   3. 尝试以管理员权限运行');
  console.log('   4. 检查防火墙和杀毒软件设置');
  
  process.exit(1);
}

// 生成详细的证书信息文件
const allIPs = getAllNetworkIPs();
const certInfo = {
  generated: new Date().toISOString(),
  platform: process.platform,
  purpose: 'VR Fishing Game Development - Universal IP Access',
  supportedDomains: allIPs,
  accessUrls: allIPs.map(ip => `https://${ip}:3034`),
  usage: [
    'npm run dev:https',
    'npm run start:https'
  ],
  ports: [3034],
  vrDeviceInstructions: [
    '1. 连接VR设备到同一网络',
    '2. 打开VR浏览器',
    '3. 访问任一支持的HTTPS地址',
    '4. 接受证书（如有提示）',
    '5. 点击"进入VR钓鱼"'
  ]
};

fs.writeFileSync('cert-info.json', JSON.stringify(certInfo, null, 2));
console.log('📝 证书信息已保存到 cert-info.json');

// 创建快速访问脚本
const quickAccessScript = `
@echo off
echo 🎣 VR钓鱼游戏 - 快速访问指南
echo.
echo 📱 请在VR设备浏览器中访问以下任一地址:
echo.
${allIPs.map(ip => `echo    https://${ip}:3034`).join('\n')}
echo.
echo ⚠️ 首次访问可能需要接受证书警告
echo 🎮 享受您的VR钓鱼体验！
pause
`;

fs.writeFileSync('vr-access.bat', quickAccessScript);
console.log('🚀 已创建 vr-access.bat 快速访问脚本'); 